#ifndef __M_QUEUE_H__
#define __M_QUEUE_H__
#include <iostream>
#include <vector>
#include <condition_variable>

/*
    实现环形队列和阻塞队列
*/

namespace cl{
/**
 * @brief RingQueue 类实现了一个环形队列，用于存储固定大小的元素。
 * 
 * 环形队列允许快速的元素添加和移除，适用于需要循环使用缓冲区的场景。
 * 如果队列已满，新的元素将覆盖旧的元素。
 */
template <typename T>
class ring_queue{
private:
    size_t _capacity;   // 队列的最大容量
    size_t _read_pos;   // 读位置索引
    size_t _write_pos;  // 写位置索引

    std::vector<T> _v;  // 存储元素
public:
    /* explicit 防止单参数构造函数发生隐式类型转换 */
    explicit RingQueue(size_t capacity);
    void push(const T &&item);
    const T& front();
    T& front();
    void pop();
    bool empty();
    bool full();
};

/**
 * @brief BlockQueue 类实现了一个线程安全的阻塞队列，支持元素的安全添加和移除。
 * 
 * 阻塞队列在队列为空时，移除操作将阻塞，直到有新元素可用；在队列满时，添加操作将阻塞，直到有空闲空间。
 */
template<typename T>
class block_queue{
private:
    ring_queue<T> _q;   // 环形队列实现
    std::mutex _mutex;  // 互斥锁，保护共享数据
    std::condition_variable _cond_push; // 推送操作条件变量
    std::condition_variable _cond_pop;  // 弹出操作条件变量
public:
    block_queue(size_t capacity);
    void enqueue(T &&item);
    T& dequeue(std::chrono::milliseconds duration = -1);
    size_t size();
};
}
#endif